#include <iostream>
#include <ctime>
#include <cstdlib>
#include <iomanip>

using namespace std;
const int MAX = 3;

int f(int n) {
    if (n == 0) {
        return 1;
    } else {
        return n * f(n - 1);
    }
}

void getSeconds(unsigned long *par);

int *getRandom();

void swap(int &x, int &y);

int main() {
    /*char site[7] = {'R', 'U', 'N', 'O', 'O', 'B', '\0'};
    //char site[]="Michael";
    cout<<site<<endl;

    string str1="abcd";

    cout<<"str1 is length="<<str1.length()<<endl;*/
    /*int var1;
    char var2[10];

    cout<<"var1变量的地址:";
    cout<<&var1<<endl;

    cout<<"var2变量的地址:";
    cout<<&var2<<endl;*/

    /*int var=20;  //实际变量的声明
    int *ip; //指针变量的声明

    ip=&var;  //在指针变量中存储var的地址

    cout<< "var的值: ";
    cout<<var<<endl;

    cout<< "Address stored in ip variable:";
    cout<<ip<<endl;

    //访问指针中地址的值
    cout<<"value of *ip variable:";
    cout<<*ip<<endl;*/

    //C++ null指针
    /*int *ptr=NULL;
    cout<<"ptr的值是: "<<ptr;

    int a=3;
    int* p=&a;
    cout<<p<<'\t'<<*p<<endl;
    p=NULL;
    cout<<p<<'\t'<<*p<<endl;
    return 0;*/

    /*//指针的运算符
    int var[MAX]={10,100,200};
    int *ptr;
    //指针中的数组地址
    ptr=var;
    for(int i=0;i<MAX;i++){
        cout<<"Address of var["<<i<<"]=";
        cout<<ptr<<endl;
        cout<<"Value of var["<<i<<"]=";
        cout<<*ptr<<endl;
        ptr++;  //移动到下一个位置

    }*/
    //递归函数
    /* int n;
     cout<<"输入n的值:";
     cin>>n;
     int sum=f(n);
     cout<<n<<"的阶乘为:"<<sum;*/

    //数组
    /* const char *names[MAX]={"Michael","zhang","long"};
     for(int i=0;i<MAX;i++){
         cout<<"Value of names["<<i<<"]= ";
         cout<<names[i]<<endl;
     }*/
    //指向指针的指针
/*  int var;
  int *ptr;
  int **pptr;

  var=3000;
  //获取var的地址
  ptr=&var;
  //使用运算符&获取ptr的地址
  pptr=&ptr;

  //使用pptr获取值
  cout<<"var的值:"<<var<<",地址:"<<&var<<ptr<<endl;
  cout<<"*ptr的值:"<<*ptr<<",地址:"<<&ptr<<endl;
  cout<<"**pptr的值:"<<**pptr<<",地址:"<<&pptr<<pptr<<endl;

  unsigned long sec;
  getSeconds(&sec);
  cout<<"Number of seconds:"<<sec<<endl;

  int *p;
  p=getRandom();
  for(int i=0;i<10;i++){
      cout<<"*(p+"<<i<<"): ";
      cout<<*(p+i)<<endl;
  }

    //引用
  *//*  int i=100;
  int& r=i;*//*
  int i;
  double d;

  //声明引用
  int& r=i;
  double& s=d;

  i=5;
  cout<<"Value of i: "<<i<<endl;
  cout<<"Value of i reference: "<<r<<endl;*/

    int a = 100;
    int b = 200;
    cout << "引用a的值:" << &a << endl;
    cout << "交换前,a的值:" << a << endl;
    cout << "交换前，b的值:" << b << endl;

    swap(a, b);
    cout << "交换后，a的值:" << a << endl;
    cout << "交换后,b的值:" << b << endl;
    //获当前时间
    time_t now = time(0);
    char *dt = ctime(&now);
    cout << "本地日期和时间:" << dt << endl;
    cout << &dt << endl;
    //把now转换为tm结构
    tm *gmtm = gmtime(&now);
    dt = asctime(gmtm);
    cout << "UTC日期和时间:" << dt << endl;

    cout << "1970到目前经过秒数:" << now << endl;
    cout << "1970到目前经过秒数:" << &now << endl;
    //输入输出流
    /*char str[]="hello C++";
    cout<<"Value of str is:"<<str<<endl;

    char name[50];
    cout<<"please input your name:";
    cin>>name;
    cout<<"your name is:"<<name<<endl;*/
    //标准错误流
    /*char str[]="Unable to read....";
    cerr<<"Error message : "<<str<<endl;*/
    //标准日志流
   /* char str[]="Unable to read...";
    clog<<"Error message : "<<str<<endl;*/
   //函数模板
  /*  cout<<setiosflags(ios::left|ios::showpoint); //设左对齐，以一般实数方式显示
    cout.precision(5); //设置除小数点外有五位有效数字
    cout<<123.456789<<endl;
    cout.width(10); //设置显示域宽10
    cout.fill('*'); //在显示区域空白处用*填充
    cout<<resetiosflags(ios::left); //清除状态左对齐
    cout<<setiosflags(ios::right); //设置右对齐
    cout<<123.456789<<endl;*/
   /* cin>>a;cin.get();
    cin>>b;cin.get();
    cin>>c;*/
    return 0;


}

//传递指针函数
void getSeconds(unsigned long *par) {
    *par = time(NULL);
    return;
}

/**
 * C++ 不支持在函数外返回局部变量的地址，除非定义局部变量为 static变量。
 * @return
 */
int *getRandom() {
    static int r[10];
    //设置种子
    srand((unsigned) time(NULL));
    for (int i = 0; i < 10; ++i) {
        r[i] = rand();
        cout << r[i] << endl;
    }
    cout << "\n";
    return r;
}

/**
 * 引用 引用变量是一个别名，也就是说，它是某个已存在变量的另一个名字。一旦把引用初始化为某个变量，就可以使用该引用名称或变量名称来指向变量。
 *
    不存在空引用。引用必须连接到一块合法的内存。
    一旦引用被初始化为一个对象，就不能被指向到另一个对象。指针可以在任何时候指向到另一个对象。
    引用必须在创建时被初始化。指针可以在任何时间被初始化。

 */
void swap(int &x, int &y) {
    int temp;
    cout << x << y << endl;
    temp = x; /*保存地址X的值*/
    x = y;  /*把y赋值给x*/
    y = temp; /*把x赋值给y*/
    return;
}